package cn.sxt.common.struts2.interceptor;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Component;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

import cn.sxt.common.struts2.action.BaseAction;
import cn.sxt.common.util.ConstatFinalUtil;
import cn.sxt.users.pojo.AAdmins;
import cn.sxt.users.pojo.AMenu;
import cn.sxt.users.pojo.ARole;
import cn.sxt.users.service.IUsersService;

/**
 * Struts2的拦截器
 * @author wangshSxt
 */
@Component("authInterceptor")
public class AuthInterceptor extends AbstractInterceptor
{
	@Resource
	private IUsersService usersService;
	
	@Override
	public String intercept(ActionInvocation invocation) throws Exception
	{
		/* 什么时候放行 */
		/* 什么时候拦截 */
		
		/* 管理员必须登陆 */
		BaseAction baseAction = (BaseAction) invocation.getAction() ; 
		HttpServletRequest request = baseAction.getRequest() ;
		HttpSession session = request.getSession(); 
		
		/* 从session中取管理员 */
		AAdmins admins = (AAdmins) session.getAttribute("admins");
		if(admins == null)
		{
			/* 木有登陆,拦截 ,配置全局Result*/
			baseAction.setInfo("非法访问,请先登陆");
			return "login" ; 
		}
		
		/* 获取当前访问的URL
		 * 
		 * 根据角色查询所有的菜单
		 * 循环菜单,(菜单里面的URL存储的是每次访问链接的一部分)
		 * 拿着当前访问的URL看是否包含菜单的URL,
		 * 如果包含,就表示有权限,如果不包含表示 木有权限
		 * 如:
		 * http://localhost:8080/auth_mana/back/admins_adminsList.htm?id=10&a=20
		 * request.getRequestURL():
		 * http://localhost:8080/auth_mana/back/admins_adminsList.htm
		 * ?后面的参数通过另外一个方法来取
		 *  */
		String currUrl = request.getRequestURL() + ""; 
		/* 获取?后面的参数 */
		String queryStr = request.getQueryString() ;
		if(queryStr == null)
		{
			queryStr = "" ; 
		}
		if(!"".equalsIgnoreCase(queryStr))
		{
			/* 后面肯定有参数 */
			currUrl += "?" + queryStr ; 
		}
		ConstatFinalUtil.LOGGER.info("---currUrl:{}",currUrl);
		
		/* 查询管理员所属的角色 */
		Map<String, Object> condMap = new HashMap<String, Object>();
		condMap.put("id", admins.getRole().getId());
		ARole role = this.usersService.findOneRoleService(condMap);
		
		/* 循环角色的菜单 */
		for (Iterator iterator = role.getMenuSet().iterator(); iterator.hasNext();)
		{
			AMenu menu = (AMenu) iterator.next();
			if(currUrl.indexOf(menu.getUrl()) != -1)
			{
				/* 能够查询到菜单的URL,有权限访问 */
				return invocation.invoke(); 
			}
		}
		
		baseAction.setInfo("木有权限访问,请联系管理员");
		/* 木有权限访问 */
		return "auth";
	}
}
